package persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Vector;

import view.ItemMaterialView;
import view.ProductoView;
import model.ItemMaterial;
import model.Material;
import model.PrendaTemporada;

public class AdministradorPersistenciaPrendaTemporada extends AdministradorPersistencia{
	
	private static AdministradorPersistenciaPrendaTemporada instancia;
	
	private String queryInsert = "INSERT INTO productos (nombre, precio, tipo, estacion, descuento,stock, estado) VALUES (?,?,'PRENDA_CON_TEMPORADA',?,0,?,'ACTIVO')" ;
	private String queryInsertItems = "insert into itemMateriales (codigoMaterial,codigoPrenda,cantidad) values (?,?,?)";
	private String queryDeleteItems = "delete from itemMateriales where codigoPrenda=?";
	private String queryUpdate = "update productos set precio=?,stock=?,estacion=? where codigoProducto=?";
	private String queryDelete = "update productos set estado='INACTIVO' where codigoProducto=?";
	private String queryObtener = "select nombre,precio,stock,estacion from productos where codigoProducto=?";
	private String queryItems = "select * from itemMateriales where codigoPrenda=?";
	private String queryVista = "select * from productos where estado='ACTIVO' and tipo='PRENDA_CON_TEMPORADA'";
	
	public static AdministradorPersistenciaPrendaTemporada getInstance(){
		if (instancia == null){
			instancia = new AdministradorPersistenciaPrendaTemporada();
		}
		return instancia;
	}
	private AdministradorPersistenciaPrendaTemporada(){
		
	}
		//INSERT
		public int insertarPrenda(String nombre, String estacion, int stock, float precio, Vector<ItemMaterialView> items){
			try{
				Connection con = super.getConnection();
				PreparedStatement ps = con.prepareStatement(queryInsert,Statement.RETURN_GENERATED_KEYS);
				ps.setString(1, nombre);
				ps.setFloat(2, precio);
				ps.setString(3, estacion);
				ps.setInt(4,stock);
				int codigoPrenda = 0;
				int rc = ps.executeUpdate();
				if (rc > 0){
					ResultSet key = ps.getGeneratedKeys();
					if (key.next()){
						codigoPrenda = key.getInt(1);
					}
				}
				for (ItemMaterialView item : items){
						PreparedStatement ps3 = con.prepareStatement(queryInsertItems);
						ps3.setInt(1, item.getCodigoMaterial());
						ps3.setInt(2, codigoPrenda);
						ps3.setInt(3, item.getCantidad());
						ps3.execute();
				}
				con.close();
				return codigoPrenda;
			}
		    catch (Exception e) {
				e.printStackTrace();
				return 0;
			}
		}  
		
		public boolean actualizarPrenda(PrendaTemporada prenda){
			try{
				Connection con = super.getConnection();
				int codigoPrenda = prenda.getCodigo();
				PreparedStatement ps = con.prepareStatement(queryDeleteItems);
				ps.setInt(1, codigoPrenda);
				ps.execute();
				for (ItemMaterial item : prenda.getMateriales()){
					int codigoMaterial = item.getMaterial().getCodigo();
					PreparedStatement ps3 = con.prepareStatement(queryInsertItems);
					ps3.setInt(1, codigoMaterial);
					ps3.setInt(2, codigoPrenda);
					ps3.setInt(3, item.getCantidad());
					ps3.execute();
				}
				PreparedStatement ps4 = con.prepareStatement(queryUpdate);
				ps4.setFloat(1, prenda.getPrecio());
				ps4.setInt(2, prenda.getStock());
				ps4.setString(3, prenda.getEstacion());
				ps4.setInt(4, codigoPrenda);
				ps4.execute();
				con.close();
				return true;
			}
			catch (Exception e) {
				e.printStackTrace();
				return false;
			}
		}

		public boolean eliminarPrenda(int codigo) throws Exception {
			Connection con = super.getConnection();			
			PreparedStatement ps = con.prepareStatement(queryDelete);
			ps.setInt(1, codigo);
			ps.execute();
			con.close();
			return true;
		}
		
		public PrendaTemporada buscarPrenda(int codigo) throws Exception {
			PrendaTemporada prenda = null;
			Connection con = super.getConnection();
			PreparedStatement ps = con.prepareStatement(queryObtener);
			ps.setInt(1, codigo);
			ResultSet rs = ps.executeQuery();
			while (rs.next()){
				prenda = new PrendaTemporada(
						codigo,
						rs.getString("nombre"),
						rs.getString("estacion"),
						rs.getInt("stock"),
						rs.getFloat("precio")
						);
				prenda.setPrecio(rs.getFloat("precio"));
			}
			ps = con.prepareStatement(queryItems);
			ps.setInt(1, codigo);
			rs = ps.executeQuery();
			while (rs.next()){
				int codigoMaterial = rs.getInt("codigoMaterial");
				Material m = AdministradorPersistenciaMateriales.getInstance().obtenerMaterial(codigoMaterial);
				prenda.crearItemMaterial(m, rs.getInt("cantidad"));
			}
			con.close();
			return prenda;
		}
		
		public Vector<ProductoView> obtenerVistaProductos() throws Exception {
			Vector<ProductoView> lista = new Vector<ProductoView>();
			Connection con = super.getConnection();
			PreparedStatement ps = con.prepareStatement(queryVista);
			ResultSet rs = ps.executeQuery();
			while (rs.next()){
				ProductoView p = new ProductoView(
						rs.getInt("codigoProducto"),
						rs.getString("nombre"),
						rs.getFloat("precio"),
						rs.getInt("stock"),
						rs.getString("tipo"),
						rs.getString("estacion")
						);
				lista.add(p);
			}
			con.close();
			return lista;
		}

}
